package cc.idoone.spring_boot_hello.redis;

import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.core.RedisTemplate;

import java.lang.reflect.Method;

/**
 * <p>注意：RedisCacheConfig这里也可以不用继承 ：CachingConfigurerSupport，也就是直接一个普通的Class就好了；</p>
 * <p>普通使用普通类的方式的话，那么在使用 @Cacheable 的时候还需要指定 keyGenerator 的名称;这样编码的时候比较麻烦。</p>
 * <p>这里主要我们之后要重新实现 key的生成策略，只要这里修改 keyGenerator，其它位置不用修改就生效了。</p>
 *
 * @author hemj
 * @version 2017/9/25
 */
@Configuration
@EnableCaching  //启用缓存，这个注解很重要
public class RedisCacheConfig extends CachingConfigurerSupport {

	@Bean
	public KeyGenerator keyGenerator() {
		return new KeyGenerator() {
			@Override
			public Object generate(Object target, Method method, Object... params) {
				StringBuilder sb = new StringBuilder();
				sb.append(target.getClass().getName());
				// sb.append("-").append(method.getName());
				for (Object obj : params) {
					sb.append("-").append(obj.toString());
				}
				System.out.println("key: " + sb);
				return sb.toString();
			}
		};
	}

	@Bean
	public CacheManager cacheManager(RedisTemplate redisTemplate) {
		RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
		// 设置缓存过期时间
		rcm.setDefaultExpiration(1); //秒
		return rcm;
	}

}
